/**
 * @file CRhoFloydAlg.hpp Deklarácia triedy CRhoFloydAlg.
 *
 * @author Martin Kosorinský.
 * @date 1.4.2009.
 */

#ifndef CRHOFLOYDALG_HEADER
#define CRHOFLOYDALG_HEADER

#include "CRhoAlgCommon.hpp"

/**
 * @brief Trieda algoritmu Pollard-Rho s Floydovým algoritmom detekcie cyklov.
 * Trieda zapúzdruje metódy a dátové prvky potrebné pri výpočte diskrétneho logaritmu
 * v grupe bodov eliptickej krivky. Využíva algoritmus známy pod menom Pollard-Rho.
 * Na detekciu detekciu kolízií vyžíva Floydov algoritmus pre detekciu cyklov v postupnostiach.
 */
class CRhoFloydAlg : CRhoAlgCommon {
public:
    /**
     * @brief Hlavná metóda spúšťajúca výpočet diskrétneho logaritmu.
     * Metóda pracuje na základe vopred inicializovaných nastavení kontextu, medzi ktoré patria parametre
     * krivky, generátor a bod, ktorého diskrétny logaritmus hľadáme.
     * Algoritmus počíta pseudonáhodnú postupnosť (deterministickú) bodov na eliptickej krivke, až kým
     * za pomoci Floydovho algoritmu neodhalí cyklus, resp. kolíziu bodov. Následne je zo získaných
     * koeficientov kolízie vypočítaný hľadaný diskrétny logaritmus. Ak získané údaje nebudú dostatočné
     * pre výpočet indexu, algoritmus bude pokračovať v hľadaní ďalšej kolízie.
     * @param[out] vysledok Premenná typu big, do ktorej bude uložený výsledok v prípade úspechy výpočtu.
     * Pamäť musí byť vopred alokovaná!
     * @warning V prípade neúspechu výpočtu obsahuje premenná @a výsledok nedefinovanú hodnotu.
     * @return Vráti TRUE v prípade úspechu výpočtu, v opačnom prípade vráti FALSE.
     */
    static bool computeLogarithm(big vysledok);
};
#endif /* CRHOFLOYDALG_HEADER */
